#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    char* const myargv[] = {
        "ls",
        "-a",
        "-l",
        NULL
    };

    char* const myenv[] = {
        "MYVAL=12345",
        "USER=LWH",
        "HOME=/home/lwh",
        NULL
    };
    extern char** environ;
    putenv("MYVAL=1111111111111111111"); // 为当前进程添加环境变量
    pid_t id = fork();
    if (0 == id)
    {
        printf("before : pid = %d, ppid = %d\n", getpid(), getppid());

        // execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
        // execl("/usr/bin/touch", "touch", "testTouch", NULL);
        // execlp("ls", "ls", "-a", "-l", NULL);
        // execv("/usr/bin/ls", myargv);
        // execvp("ls", myargv);
        // 执行自己的程序
        // execl("./otherExe", "otherExe", NULL);
        // execl("/usr/bin/bash", "bash", "test.sh", NULL);
        // execle("./otherExe", "otherExe", "-l", "-a", NULL, environ);
        // execle("./otherExe", "otherExe", "-l", "-a", NULL, myenv);
        // execve("./otherExe", myargv, myenv);
        execvpe("./otherExe", myargv, myenv);

        printf("after : pid = %d, ppid = %d\n", getpid(), getppid());
        exit(1);
    }
    // 父进程
//    printf("env[0] : %p\n", environ[0]);
//    printf("这是父进程, MYVAL=%s", getenv("MYVAL"));
    pid_t ret = waitpid(id, NULL, 0);
    if (ret > 0)    
        printf("wait success, pid : %d, ret id : %d\n", getpid(), ret);
    return 0;
}
